home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d11
/
frasrc14.arc
/
FR8514A.ASM
< prev
next >
Wrap
Assembly Source File
|
1990-08-02
|
7KB
|
464 lines
IFDEF ??version
MASM51
QUIRKS
ENDIF
.MODEL medium,c
.8086
HOPEN equ 8
HSMX equ 9
HINT equ 16
HLDPAL equ 19
HBBW equ 21
HBBR equ 23
HBBCHN equ 24
HBBC equ 25
HQMODE equ 29
HRECT equ 32
HCLOSE equ 34
HINIT equ 48
HSYNC equ 49
HSPAL equ 57
HRPAL equ 58
.DATA
extrn xdots:word, ydots:word ; number of dots across and down
extrn dacbox:byte, daccount:word
afiptr dd 0
xadj dw 0
yadj dw 0
extrn paldata:byte ; 1024-byte array (in GENERAL.ASM)
extrn stbuff:byte ; 415-byte array (in GENERAL.ASM)
linedata db 0
hopendata db 3, 0, 0, 0, 0
hclosedata dw 2, 0
hinitdata dw 2, 0
bbw dw 10, 8, 0, 0, 0, 0
bbr dw 12, 8, 0, 0, 0, 0, 0
smx dw 2, 0
chn dw 6
dd linedata
dw 1
pal dw 10, 0, 0, 256
dd paldata
hidata dw 4, 0, 8000h
amode dw 18, 9 dup(?)
;svpaldata dw 769
; db 769 dup(?)
oops db 13,10
db "Couldn't find the 8514/A interface"
db 13,10
db "(Maybe you forgot to load HDILOAD)"
db 13,10
db "$"
.CODE
public
callafi proc near
push ds ; Pass the parameter pointer
push si
shl ax,1 ; form offset from entry no. required
shl ax,1
mov si,ax
les bx, afiptr ; entry block address to es:bx
call dword ptr es:[bx][si] ; call entry point
ret ; return to caller
callafi endp
getafi proc near
mov ax,357fh ; read interrupt vector 7f
int 21h
mov ax,es
or ax,bx ; is 7f vector null
stc
jz getafiret
mov ax,0105h ; get Interface address
int 7fh ; by software interrupt 7f
jc getafiret ; Interface not OK if carry set
mov word ptr afiptr,dx ; save afi pointer offset
mov word ptr afiptr+2,cx ; save afi pointer segment
clc ; clear carry flag
getafiret:
ret ; return to caller
getafi endp
do85open proc near
push ax
mov ax, HOPEN
call callafi
mov ax, offset stbuff ;get the state segment
add ax, 15
mov cl, 4
shr ax, cl
mov bx, ds
add ax, bx
mov si, offset hinitdata
mov [si] + 2, ax
pop ax
call callafi
clc
ret
do85open endp
open8514 proc far
call getafi ;get adapter interface
jc afinotfound
; mov si, offset svpaldata
; mov ax, HSPAL
; call callafi
mov bl, 0 ;if > 640 x 480 then 1024 x 768
mov ax, xdots
cmp ax, 640
ja setupopen
mov ax, ydots
cmp ax, 480
ja setupopen
inc bl
setupopen:
mov si, offset hopendata ;open the adapter
mov byte ptr [si + 2], 40h ;zero the image but leave pallette
mov [si + 3], bl
mov ax, HINIT ;initialize state
call do85open
jc afinotfound
mov si, offset amode ;make sure on the size
mov ax, HQMODE ;get the adapter mode
call callafi
mov ax, amode + 10 ;get the screen width
cmp ax, xdots
jae xdotsok ;check for fit
mov xdots, ax
xdotsok:
sub ax, xdots ;save centering factor
shr ax, 1
mov xadj, ax
mov ax, amode + 12 ;get the screen height
cmp ax, ydots
jae ydotsok
mov ydots, ax
ydotsok:
sub ax, ydots
shr ax, 1
mov yadj, ax
clc
ret
afinotfound: ; No 8514/A interface found
mov ax,03h ; reset to text mode
int 10h
mov dx,offset oops ; error out
mov ah,9 ; sending the message
int 21h
mov ax,4c00h ; end the program
int 21h
ret ; should never get here!
open8514 endp
reopen8514 proc far
mov si, offset hopendata ;open the adapter
mov byte ptr [si + 2], 0C0h ;zero the image but leave pallette
mov ax, HSYNC ;initialize state
call do85open
ret
reopen8514 endp
close8514 proc far
mov si, offset hclosedata ;turn off 8514a
mov ax, HCLOSE
call callafi
; mov si, offset svpaldata ;restore the pallette
; mov ax, HRPAL
; call callafi
ret
close8514 endp
fr85wdot proc far uses si
mov linedata, al
mov bbw + 4, 1 ;define the rectangle
mov bbw + 6, 1
add cx, xadj
add dx, yadj
mov bbw + 8, cx
mov bbw + 10, dx
mov si, offset bbw
mov ax, HBBW
call callafi
mov si, offset chn
mov word ptr [si + 2], offset linedata
mov word ptr [si + 6], 1 ;send the data
mov ax, HBBCHN
call callafi
fr85wdotx:
ret
fr85wdot endp
fr85wbox proc far uses si
add ax, xadj
add cx, xadj
add dx, yadj
sub ax, cx
mov chn + 2, si ;point to data
mov chn + 6, ax
mov bbw + 4, ax ;define the rectangle
mov bbw + 6, 1
mov bbw + 8, cx
mov bbw + 10, dx
mov si, offset bbw
mov ax, HBBW
call callafi
mov si, offset chn
mov ax, HBBCHN
call callafi
ret
fr85wbox endp
fr85rdot proc far uses si
mov bbr + 4, 1 ;define the rectangle
mov bbr + 6, 1
add cx, xadj
add dx, yadj
mov bbr + 10, cx
mov bbr + 12, dx
mov si, offset bbr
mov ax, HBBR
call callafi
mov si, offset chn
mov word ptr [si + 2], offset linedata
mov word ptr [si + 6], 1 ;send the data
mov ax, HBBCHN
call callafi
mov al, linedata
fr85rdotx:
ret
fr85rdot endp
fr85rbox proc far uses si
add ax, xadj
add cx, xadj
add dx, yadj
sub ax, cx
mov chn + 2, di ;point to data
mov chn + 6, ax
mov bbr + 4, ax ;define the rectangle
mov bbr + 6, 1
mov bbr + 10, cx
mov bbr + 12, dx
mov si, offset bbr
mov ax, HBBR
call callafi
mov si, offset chn
mov ax, HBBCHN
call callafi
ret
fr85rbox endp
;fr85zoom proc far uses si
;
; add ax, xadj ; ending col
; add bx, yadj ; ending row
; add cx, xadj ; starting col
; add dx, yadj ; starting row
; sub ax, cx ; how many columns?
; inc ax ; this many
; sub bx, dx ; how many rows?
; inc bx ; this many
; mov bbw + 4, ax ; width
; mov bbw + 6, bx ; height
; mov bbw + 8, cx ; source col
; mov bbw + 10, dx ; source row
; add ax, bx ; how many dots??
; dec ax ; this many
; mov chn + 2, si ;point to data
; mov chn + 6, ax
;
; mov si, offset smx ; define the mix
; mov smx+2, 0016h ; screen XOR new
; mov ax, HSMX ; set the mix
; call callafi ; do it
;
; mov si, offset bbw ; set the blit
; mov ax, HBBW ; blit mem to vid mem
; call callafi ; do it
;
; mov si, offset chn ; set the move
; mov ax, HBBCHN ; chaining
; call callafi ; do it
;
; mov si, offset smx ; define the mix
; mov smx+2, 0002h ; overlay
; mov ax, HSMX ; set the mix
; call callafi ; do it
;
; ret
;
;fr85zoom endp
w8514pal proc far
mov si, offset dacbox
mov cx, daccount ;limit daccount to 128 to avoid fliker
cmp cx, 128
jbe countok
mov cx, 128
mov daccount, cx
countok: ;now build 8514 pallette
mov ax, 256 ;from the data in dacbox
mov pal + 4, 0
mov di, offset paldata
cld
cpallp:
push ax ;do daccount at a time
mov dx, di
cmp ax, cx
jae dopass
mov cx, ax
dopass:
mov pal + 6, cx ;entries this time
push cx
cpallp2:
push ds ;pallette format is r, b, g
pop es ;0 - 255 each
lodsb ;red
shl al, 1
shl al, 1
stosb
lodsb ;green
shl al, 1
shl al, 1
xchg ah, al
lodsb ;blue
shl al, 1
shl al, 1
stosw
mov al, 0 ;filler
stosb
loop cpallp2
push si
push di
push dx
mov si, hidata ;wait for flyback
mov ax, HINT
call callafi
pop dx
mov pal + 8, dx
mov si, offset pal ;load this piece
mov ax, HLDPAL
call callafi
pop di
pop si
pop cx
add pal + 4, cx ;increment the pallette index
pop ax
sub ax, cx
jnz cpallp
ret
w8514pal endp
end